Hibernate হল একটি ওপেন সোর্স Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশন এবং রিলেশনাল ডেটাবেসের মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। Hibernate ব্যবহার করে, আপনি Java objects এবং database tables এর মধ্যে ম্যাপিং করতে পারেন, যাতে Java অ্যাপ্লিকেশন সহজে ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে পারে।
Hibernate Mapping Techniques হল বিভিন্ন পদ্ধতি যা আপনি ব্যবহার করতে পারেন Java objects এবং database tables এর মধ্যে সম্পর্ক স্থাপন করতে। Hibernate মূলত চারটি প্রধান ম্যাপিং পদ্ধতি ব্যবহার করে:
এই ম্যাপিংগুলো Java ক্লাস ও ডেটাবেস টেবিলের মধ্যে সম্পর্ক সঠিকভাবে এবং কার্যকরভাবে তৈরি করতে ব্যবহৃত হয়।
One-to-One Mapping হল সেই সম্পর্ক যেখানে একটি অবজেক্ট আরেকটি অবজেক্টের সাথে এক-একমাত্র সম্পর্ক স্থাপন করে। এটি সাধারণত দুটি টেবিলের মধ্যে একাধিক কনট্রোলিত সম্পর্ক তৈরি করে।
ধরা যাক আমাদের দুটি ক্লাস Employee এবং Address রয়েছে। প্রতিটি Employee এর একটি Address থাকে এবং প্রতিটি Address একটি Employee এর সাথে সম্পর্কিত থাকে।
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "address_id")
private Address address;
// Constructors, Getters, and Setters
}
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String street;
private String city;
// Constructors, Getters, and Setters
}
এখানে, Employee এবং Address ক্লাসের মধ্যে One-to-One Relationship প্রতিষ্ঠিত হয়েছে। @OneToOne অ্যানোটেশন দিয়ে এটি নির্ধারণ করা হয়েছে, এবং @JoinColumn ব্যবহার করে address_id কলামের মাধ্যমে সম্পর্ক স্থাপন করা হয়েছে।
One-to-Many এবং Many-to-One ম্যাপিং দুটি সম্পর্ক স্থাপন করে যেখানে একটি টেবিল একাধিক রেকর্ডের সাথে সম্পর্কিত হয়। এর মধ্যে One-to-Many সম্পর্ক primary side (একটি) টেবিলের সাথে সম্পর্কিত, আর Many-to-One সম্পর্ক inverse side (অনেকগুলি) টেবিলের সাথে সম্পর্কিত।
ধরা যাক আমাদের দুটি ক্লাস Department এবং Employee রয়েছে। একেকটি Department-এ অনেক Employee থাকতে পারে, কিন্তু প্রতিটি Employee একটি Department-এর অন্তর্গত।
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "department")
private Set<Employee> employees;
// Constructors, Getters, and Setters
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Constructors, Getters, and Setters
}
এখানে, Department ক্লাসে One-to-Many এবং Employee ক্লাসে Many-to-One সম্পর্ক স্থাপন করা হয়েছে। @OneToMany অ্যানোটেশন দিয়ে Department ক্লাসের মধ্যে একাধিক Employee সম্পর্ক তৈরি করা হয়েছে, আর @ManyToOne অ্যানোটেশন দিয়ে Employee ক্লাসে Department সম্পর্ক স্থাপন করা হয়েছে।
Many-to-Many Mapping হল সেই সম্পর্ক যেখানে একটি টেবিল একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে এবং অন্য টেবিলও একইভাবে একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। এই সম্পর্কটি সাধারণত একটি join table বা bridge table ব্যবহার করে ম্যাপ করা হয়।
ধরা যাক আমাদের দুটি ক্লাস Student এবং Course রয়েছে, যেখানে একেকটি Student একাধিক Course নেয় এবং একেকটি Course একাধিক Student গ্রহণ করতে পারে।
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
private Set<Course> courses;
// Constructors, Getters, and Setters
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(mappedBy = "courses")
private Set<Student> students;
// Constructors, Getters, and Setters
}
এখানে, @ManyToMany অ্যানোটেশন দ্বারা Student এবং Course ক্লাসের মধ্যে Many-to-Many Relationship স্থাপন করা হয়েছে। @JoinTable ব্যবহার করে একটি bridge table (student_course) তৈরি করা হয়েছে, যা student_id এবং course_id কলামগুলির মাধ্যমে সম্পর্ক স্থাপন করেছে।
Hibernate ইনহেরিটেন্স (উত্তরাধিকার) সম্পর্কেও ম্যাপিং সাপোর্ট করে। Hibernate ৩টি প্রধান ইনহেরিটেন্স স্ট্রাটেজি সমর্থন করে:
ধরা যাক আমাদের একটি Employee ক্লাস রয়েছে এবং এর দুটি সাবক্লাস FullTimeEmployee এবং PartTimeEmployee।
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Constructors, Getters, and Setters
}
@Entity
@DiscriminatorValue("FullTime")
public class FullTimeEmployee extends Employee {
private double salary;
// Constructors, Getters, and Setters
}
@Entity
@DiscriminatorValue("PartTime")
public class PartTimeEmployee extends Employee {
private double hourlyRate;
// Constructors, Getters, and Setters
}
এখানে, Single Table Inheritance ব্যবহৃত হয়েছে, যেখানে সমস্ত Employee সম্পর্কিত তথ্য একটি সিঙ্গল টেবিলে থাকবে, তবে @DiscriminatorColumn এবং @DiscriminatorValue দ্বারা FullTimeEmployee এবং PartTimeEmployee এর মধ্যে পার্থক্য করা হয়েছে।
Hibernate এর Mapping Techniques-এর মাধ্যমে আপনি ডেটাবেসের বিভিন্ন সম্পর্ক যেমন One-to-One, One-to-Many, Many-to-Many, এবং Inheritance সহজভাবে Java objects এর সাথে ম্যাপ করতে পারেন। Hibernate আপনাকে JPA (Java Persistence API) সাপোর্ট সহ ডেটাবেসের সাথে কার্যকরভাবে ইন্টারঅ্যাক্ট করতে সহায়ক একটি শক্তিশালী ORM সমাধান প্রদান করে, যা ডেটাবেসের অপারেশনকে সহজ এবং দ্রুততর করে তোলে।
Hibernate Mapping হল Object-Relational Mapping (ORM) প্রযুক্তির একটি গুরুত্বপূর্ণ অংশ, যা Java অবজেক্টগুলিকে ডেটাবেস টেবিলের সাথে সম্পর্কিত করে। Hibernate, JPA (Java Persistence API) এর মাধ্যমে ডেটাবেস টেবিল এবং Java ক্লাসের মধ্যে সম্পর্ক স্থাপন করতে সহায়তা করে।
Hibernate Mapping নিশ্চিত করে যে, Java অবজেক্টের ডেটা ডেটাবেস টেবিলের সঠিক কনফিগারেশনের মাধ্যমে সংরক্ষিত হয় এবং ডেটাবেসের ডেটা Java অবজেক্টে পরিবর্তিত হয়। এই প্রক্রিয়াটি খুবই স্বয়ংক্রিয় এবং ডেটাবেসের সাথে যোগাযোগ সহজ ও মডুলার করে তোলে।
Hibernate Mapping-এর তিনটি প্রধান প্রকার রয়েছে:
এছাড়াও, Hibernate ম্যানিপুলেশন এর জন্য Inheritance Mapping এবং Component Mapping রয়েছে, যা জটিল ডেটাবেস সম্পর্ক এবং অবজেক্ট মডেলকে আরো কার্যকরীভাবে ম্যানেজ করতে সাহায্য করে।
One-to-One Mapping হল এমন একটি সম্পর্ক যেখানে একটি টেবিলের একটি রেকর্ড অন্য একটি টেবিলের একটি রেকর্ডের সাথে সম্পর্কিত থাকে। Hibernate-এ এটি কিভাবে ম্যানেজ করা যায় তা নিচে দেখানো হয়েছে।
ধরা যাক, আমাদের দুটি ক্লাস আছে: Person এবং Passport। একটি Person এর একটি একক Passport থাকতে পারে।
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToOne
@JoinColumn(name = "passport_id")
private Passport passport;
// Getters and Setters
}
@Entity
@Table(name = "passport")
public class Passport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String passportNumber;
// Getters and Setters
}
এখানে, @OneToOne
অ্যানোটেশনটি বলে দেয় যে Person এবং Passport টেবিলগুলির মধ্যে এক-থেকে-এক সম্পর্ক রয়েছে। @JoinColumn
দ্বারা, আমরা passport_id
কলামকে Person টেবিলের সাথে যুক্ত করি।
One-to-Many এবং Many-to-One সম্পর্ক একে অপরের বিপরীত। একটি One-to-Many সম্পর্কের মধ্যে একটি টেবিলের একটি রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত থাকতে পারে, এবং Many-to-One সম্পর্কের মধ্যে অনেক রেকর্ড একটি একক রেকর্ডের সাথে সম্পর্কিত থাকতে পারে।
ধরা যাক, আমাদের Department এবং Employee টেবিল রয়েছে, যেখানে একটি Department এর অনেক Employee থাকতে পারে।
@Entity
@Table(name = "department")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy = "department")
private Set<Employee> employees;
// Getters and Setters
}
@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
এখানে, Department টেবিলের একটি রেকর্ড অনেক Employee রেকর্ডের সাথে সম্পর্কিত থাকতে পারে। mappedBy
অ্যাট্রিবিউট দ্বারা, Hibernate জানে যে department
ক্লাসের মধ্যে সম্পর্কটি Employee ক্লাসের মধ্যে বিদ্যমান।
Many-to-Many Mapping হল এমন একটি সম্পর্ক যেখানে একটি টেবিলের একাধিক রেকর্ড অন্য একটি টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। Hibernate-এ এই সম্পর্কের জন্য একটি junction table বা association table প্রয়োজন হয়, যা দুটি টেবিলের মধ্যে সম্পর্ক রাখে।
ধরা যাক, আমাদের দুটি ক্লাস রয়েছে: Student এবং Course, এবং একেকটি Student একাধিক Course গ্রহণ করতে পারে এবং একেকটি Course অনেক Student-এর জন্য হতে পারে।
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
private Set<Course> courses;
// Getters and Setters
}
@Entity
@Table(name = "course")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToMany(mappedBy = "courses")
private Set<Student> students;
// Getters and Setters
}
এখানে, Student এবং Course টেবিলের মধ্যে একটি Many-to-Many সম্পর্ক প্রতিষ্ঠিত হয়েছে। @JoinTable
অ্যানোটেশনটি একটি junction table (student_course
) তৈরি করে, যা student_id
এবং course_id
সহ সম্পর্ক রাখে।
Hibernate ইনহেরিটেন্স ম্যাপিং দ্বারা এক ক্লাসের ইনহেরিটেড বৈশিষ্ট্যগুলিকে অন্য ক্লাসে মানিয়ে নেয়। Hibernate এ তিনটি ইনহেরিটেন্স ম্যাপিং কৌশল রয়েছে:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "vehicle_type", discriminatorType = DiscriminatorType.STRING)
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
// Getters and Setters
}
@Entity
@DiscriminatorValue("car")
public class Car extends Vehicle {
private int numberOfDoors;
// Getters and Setters
}
@Entity
@DiscriminatorValue("bike")
public class Bike extends Vehicle {
private boolean hasPedals;
// Getters and Setters
}
এখানে, Vehicle
ক্লাসের সকল ইনহেরিটেড ক্লাস (Car
এবং Bike
) একই টেবিলের মধ্যে সংরক্ষিত হবে।
Hibernate-এ component mapping ব্যবহার করে আপনি Java অবজেক্টের উপাদানগুলিকে আরেকটি অবজেক্টে অন্তর্ভুক্ত করতে পারেন। এটি @Embeddable
এবং @Embedded
অ্যানোটেশন ব্যবহার করে করা হয়।
@Embeddable
public class Address {
private String street;
private String city;
// Getters and Setters
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Embedded
private Address address;
// Getters and Setters
}
এখানে, Address
ক্লাসটি Employee ক্লাসে অন্তর্ভুক্ত করা হয়েছে, যা component mapping হিসেবে কাজ করে।
Hibernate Mapping-এর মাধ্যমে আপনি আপনার Java অবজেক্ট এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক সহজেই স্থাপন করতে পারেন। Hibernate ORM আপনাকে বিভিন্ন ধরনের সম্পর্ক One-to-One, One-to-Many, Many-to-Many, Inheritance Mapping, এবং Component Mapping প্রদান করে, যা ডেটাবেস অপারেশন এবং ডেটা ম্যানেজমেন্টকে আরও সহজ এবং কার্যকরী করে তোলে।
Hibernate একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক, যা জাভা ক্লাসের সাথে রিলেশনাল ডাটাবেসের টেবিলগুলো ম্যাপিং করতে সাহায্য করে। Hibernate ডেটা ম্যানিপুলেশন করার জন্য XML Mapping এবং Annotations দুটি প্রধান পদ্ধতি ব্যবহার করে। এ দুটি পদ্ধতি ডাটাবেসের টেবিলের সাথে ক্লাসের সম্পর্ক স্থাপন করে।
Hibernate-এ XML Mapping হল একটি পদ্ধতি যেখানে ক্লাস এবং টেবিলের মধ্যে সম্পর্ক XML Configuration ফাইলে দেওয়া হয়। এই পদ্ধতিতে, আপনি ক্লাসের fields এবং টেবিলের columns এর মধ্যে সম্পর্ক তৈরী করেন।
Step 1: Hibernate Configuration (hibernate.cfg.xml)
এটি হল Hibernate এর কনফিগারেশন ফাইল যেখানে ডাটাবেসের সংযোগ তথ্য এবং মডেল ক্লাসগুলির mapping দেওয়া থাকে।
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<!-- JDBC connection pool settings -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<!-- Specify the dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Echo all executed SQL to stdout -->
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Mention annotated class -->
<mapping resource="com/example/hibernate/MyEntity.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Step 2: Entity Class Mapping (MyEntity.hbm.xml)
এটি XML ফাইল যা Java ক্লাস এবং ডাটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করে।
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.example.hibernate.MyEntity" table="MY_ENTITY">
<id name="id" column="ID">
<generator class="increment"/>
</id>
<property name="name" column="NAME"/>
</class>
</hibernate-mapping>
এখানে, MyEntity
ক্লাসটি MY_ENTITY
টেবিলের সাথে ম্যাপ করা হয়েছে। id
ফিল্ডটি টেবিলের ID
কলামের সাথে সম্পর্কিত, এবং name
ফিল্ডটি NAME
কলামের সাথে সম্পর্কিত।
Hibernate Annotations ব্যবহার করে ক্লাস এবং টেবিলের মধ্যে সম্পর্ক স্থাপন করা আরও সহজ এবং কম কনফিগারেশন সহকারে করা যায়। Hibernate 3.5 এর পর থেকে JPA (Java Persistence API) অ্যানোটেশনগুলি ব্যবহার করা যায়, যা ORM সমর্থন করে এবং এটি ডাটাবেস টেবিলের সাথে মডেল ক্লাসগুলির সম্পর্ক সরাসরি তৈরি করতে সাহায্য করে।
Step 1: Entity Class (Using Annotations)
এখানে আমরা JPA Annotations ব্যবহার করে Hibernate মডেল ক্লাস তৈরি করছি।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
// Getter and Setter methods
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
এখানে:
@Entity
: এই অ্যানোটেশনটি নির্দেশ করে যে এই ক্লাসটি একটি JPA Entity, যা ডাটাবেস টেবিলের সাথে ম্যাপ হবে।@Id
: এটি ডাটাবেস টেবিলের প্রাইমারি কী ফিল্ড নির্দেশ করে।@GeneratedValue
: এই অ্যানোটেশনটি প্রাইমারি কী ফিল্ডের জন্য ভ্যালু সৃষ্টির কৌশল নির্ধারণ করে।Step 2: Hibernate Configuration (hibernate.cfg.xml)
এটি আগের মতই, যেখানে Hibernate কনফিগারেশন দেওয়া থাকবে।
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC and Hibernate Configuration Properties -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Mention the annotated class -->
<mapping class="com.example.hibernate.MyEntity"/>
</session-factory>
</hibernate-configuration>
এখানে, <mapping class="com.example.hibernate.MyEntity"/>
এর মাধ্যমে MyEntity
ক্লাসটি Hibernate কনফিগারেশনে উল্লেখ করা হয়েছে।
Feature | XML Mapping | Annotations Based Mapping |
---|---|---|
Complexity | আরও বেশি কনফিগারেশন প্রয়োজন | কম কনফিগারেশন এবং ক্লাসে অ্যানোটেশন ব্যবহার করা সহজ |
Ease of Use | বেশি কনফিগারেশন ফাইল প্রয়োজন | ডিরেক্ট ক্লাসে অ্যানোটেশন ব্যবহার করা সহজ |
Flexibility | আরও নমনীয় কনফিগারেশন প্রদান করে | অ্যানোটেশনগুলি সহজ ও সোজা, তবে কিছু ক্ষেত্রে সীমিত হতে পারে |
Maintainability | আলাদা XML ফাইল তৈরি করতে হয় | কোডের সাথে একই ফাইলে সবকিছু থাকে |
Performance | প্রায় সমান কার্যক্ষমতা | খুব সামান্য পারফরম্যান্স পার্থক্য |
Learning Curve | কিছুটা সময় নেয় অভ্যস্ত হতে | দ্রুত শিখতে এবং ব্যবহার করতে সুবিধাজনক |
Hibernate ডাটাবেসের সাথে কাজ করার জন্য XML Mapping এবং Annotations Based Mapping দুটি গুরুত্বপূর্ণ পদ্ধতি প্রদান করে।
আপনার প্রোজেক্টের প্রয়োজন এবং ব্যবহারের সহজতা অনুযায়ী আপনি যেকোনো একটি পদ্ধতি নির্বাচন করতে পারেন।
Hibernate হল একটি জনপ্রিয় ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা ডাটাবেস টেবিলের মধ্যে অবজেক্ট সম্পর্ক (relationships) তৈরি করতে সহায়ক। Hibernate ব্যবহার করে বিভিন্ন সম্পর্ক (relationship) যেমন One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many ম্যাপিং করা যেতে পারে।
এখানে Hibernate-এ One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কের ম্যাপিংয়ের বিস্তারিত আলোচনা করা হলো।
One-to-One Mapping এমন একটি সম্পর্ক যেখানে একটি অবজেক্ট অন্য একটি অবজেক্টের সাথে একে অপরের সাথে সম্পর্কিত থাকে। অর্থাৎ, একে অপরের সাথে এক একক সম্পর্ক থাকে।
Employee
এবং Address
ক্লাসের মধ্যে একে অপরের সাথে সম্পর্ক।@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToOne
@JoinColumn(name = "address_id")
private Address address; // Employee has one Address
// Getters and setters
}
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String street;
private String city;
@OneToOne(mappedBy = "address")
private Employee employee; // Address belongs to one Employee
// Getters and setters
}
@OneToOne
: এটি সম্পর্কের ধরন নির্ধারণ করে, যেখানে একটি Employee
একটিমাত্র Address
এর সাথে সম্পর্কিত।@JoinColumn
: এটি ডাটাবেসের সারণীতে একটিমাত্র কলাম তৈরি করে যা এই সম্পর্কটিকে মান্য করে।One-to-Many Mapping এমন একটি সম্পর্ক যেখানে একটি অবজেক্ট একাধিক অবজেক্টের সাথে সম্পর্কিত থাকে। এক্ষেত্রে, একটি Parent
অবজেক্ট অনেকগুলো Child
অবজেক্টের সাথে সম্পর্কিত থাকে।
Department
এবং Employee
ক্লাসের মধ্যে সম্পর্ক, যেখানে একটিমাত্র Department
অনেক Employee
ধারণ করে।@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy = "department")
private Set<Employee> employees; // A department has many employees
// Getters and setters
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department; // An employee belongs to one department
// Getters and setters
}
@OneToMany
: এটি নির্ধারণ করে যে একটি Department
একাধিক Employee
ধারণ করতে পারে।mappedBy
: এটি Employee
ক্লাসের department
ফিল্ডের মাধ্যমে সম্পর্কটি নির্দেশ করে।@ManyToOne
: এটি Employee
কে Department
এর সাথে সম্পর্কিত করে।Many-to-One Mapping একটি সম্পর্ক যেখানে একাধিক অবজেক্ট একটি একক অবজেক্টের সাথে সম্পর্কিত থাকে। এটি One-to-Many সম্পর্কের বিপরীত।
Employee
এবং Department
ক্লাসের মধ্যে সম্পর্ক, যেখানে একাধিক Employee
একটি Department
এর সাথে সম্পর্কিত।@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department; // Multiple employees belong to one department
// Getters and setters
}
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
// Getters and setters
}
@ManyToOne
: এটি Employee
এর একাধিক ইনস্ট্যান্সকে Department
এর একটি ইনস্ট্যান্সের সাথে সম্পর্কিত করে।@JoinColumn
: এটি সম্পর্কিত ডাটাবেস টেবিলের কলামটি নির্দেশ করে।Many-to-Many Mapping একটি সম্পর্ক যেখানে একাধিক অবজেক্ট একাধিক অবজেক্টের সাথে সম্পর্কিত থাকে। অর্থাৎ, একটি Student
একাধিক Course
এর সাথে এবং একটি Course
একাধিক Student
এর সাথে সম্পর্কিত থাকে।
Student
এবং Course
ক্লাসের মধ্যে সম্পর্ক, যেখানে একাধিক Student
একাধিক Course
গ্রহণ করতে পারে।@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private Set<Course> courses; // A student can enroll in multiple courses
// Getters and setters
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToMany(mappedBy = "courses")
private Set<Student> students; // A course can have multiple students
// Getters and setters
}
@ManyToMany
: এটি একটি সম্পর্ক নির্দেশ করে যেখানে একাধিক Student
একাধিক Course
এর সাথে সম্পর্কিত।@JoinTable
: এটি student_course
নামক এক মাধ্যমিক টেবিল তৈরি করে, যেখানে দুটি টেবিলের (Student এবং Course) সম্পর্ক রক্ষা করা হয়।mappedBy
: এটি Course
ক্লাসের মধ্যে সম্পর্ক নির্দেশ করে।Hibernate-এ One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কের ম্যাপিং বেশ সহজ এবং শক্তিশালী। বিভিন্ন সম্পর্কের মধ্যে ডিপেনডেন্সি ম্যানেজমেন্ট করার জন্য Hibernate এর অ্যানোটেশন ব্যবহার করা হয়, যেমন @OneToMany
, @ManyToOne
, @OneToOne
, এবং @ManyToMany
।
এই ম্যাপিংগুলি ব্যবহার করে আপনি জাভা অবজেক্ট এবং ডাটাবেস টেবিলগুলোর মধ্যে সম্পর্ক তৈরি করতে পারবেন এবং আপনার অ্যাপ্লিকেশনে ডেটাবেস ইন্টারঅ্যাকশনের কার্যক্ষমতা এবং সুবিধা বৃদ্ধি করতে পারবেন।
Hibernate একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশনে ডেটাবেসের টেবিলগুলোর সাথে object-oriented কনসেপ্টের মধ্যে ম্যাপিং করে। Hibernate ডেটাবেসের Primary Key এবং Foreign Key সম্পর্কগুলিকে সহজে ম্যানেজ করতে সাহায্য করে, এবং আপনি Java objects এবং Relational database tables এর মধ্যে সম্পর্কগুলো সঠিকভাবে ম্যাপ করতে পারেন।
এখানে Primary Key এবং Foreign Key Mapping এর জন্য Hibernate এর ব্যবহৃত কৌশলগুলো এবং Annotations এবং XML কনফিগারেশনে Mapping কিভাবে করা যায় তা বিস্তারিতভাবে আলোচনা করা হবে।
Primary Key হল একটি টেবিলের একটি ফিল্ড যেটি প্রতিটি রেকর্ডকে ইউনিকভাবে চিহ্নিত করে। Hibernate এ, @Id
অ্যানোটেশন বা <id>
XML ট্যাগ ব্যবহার করে একটি ক্লাসের প্রপার্টিকে Primary Key হিসেবে চিহ্নিত করা হয়।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
public class Student {
@Id // Primary Key annotation
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-generated primary key
private int id;
private String name;
private String course;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
}
@Id
: এই অ্যানোটেশনটি ক্লাসের প্রপার্টিকে Primary Key হিসেবে চিহ্নিত করে।@GeneratedValue
: এই অ্যানোটেশনটি জানিয়ে দেয় যে, Primary Key টি অটোমেটিক্যালি জেনারেট হবে (যেমন, IDENTITY
, SEQUENCE
বা AUTO
স্ট্র্যাটেজি অনুযায়ী)।XML কনফিগারেশনেও Primary Key ম্যানেজ করা সম্ভব। এখানে <id>
ট্যাগ ব্যবহার করে Primary Key ম্যাপ করা হয়।
<class name="Student" table="student">
<id name="id" column="id">
<generator class="identity" /> <!-- Auto-generated Primary Key -->
</id>
<property name="name" column="name"/>
<property name="course" column="course"/>
</class>
<id>
: এটি ক্লাসের প্রপার্টিকে Primary Key হিসেবে চিহ্নিত করে এবং <generator>
ট্যাগের মাধ্যমে কীভাবে এটি জেনারেট হবে তা নির্ধারণ করে।Foreign Key হল একটি কলাম যা অন্য একটি টেবিলের Primary Key-এর সাথে সম্পর্কিত। Hibernate এ Foreign Key Mapping করার জন্য বিভিন্ন সম্পর্ক তৈরি করা হয়, যেমন One-to-One, One-to-Many, এবং Many-to-Many। এখানে কিছু সাধারণ Foreign Key Mapping এর উদাহরণ দেওয়া হলো।
একটি One-to-One সম্পর্ক তৈরি করার জন্য @OneToOne
এবং @JoinColumn
অ্যানোটেশন ব্যবহার করা হয়। এখানে Foreign Key হিসাবে student_id
কে চিহ্নিত করা হয়েছে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.JoinColumn;
@Entity
public class Student {
@Id
private int id;
private String name;
@OneToOne
@JoinColumn(name = "address_id") // Foreign Key Mapping
private Address address;
// Getters and Setters
}
@Entity
public class Address {
@Id
private int id;
private String city;
// Getters and Setters
}
@OneToOne
: এটি One-to-One সম্পর্ক নির্দেশ করে।@JoinColumn
: এটি সম্পর্কিত টেবিলের জন্য Foreign Key কলাম নির্ধারণ করে।একটি One-to-Many সম্পর্কের মধ্যে, একটি প্রাথমিক টেবিলের একাধিক রেকর্ড অন্য টেবিলের এক রেকর্ডের সাথে সম্পর্কিত থাকে। @OneToMany
এবং @ManyToOne
অ্যানোটেশন ব্যবহার করা হয়, এবং Foreign Key টেবিলের মধ্যে student_id
হিসেবে মানানসই হয়।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Student {
@Id
private int id;
private String name;
@OneToMany(mappedBy = "student")
private Set<Course> courses;
// Getters and Setters
}
@Entity
public class Course {
@Id
private int id;
private String courseName;
@ManyToOne
@JoinColumn(name = "student_id") // Foreign Key mapping
private Student student;
// Getters and Setters
}
@OneToMany(mappedBy = "student")
: mappedBy
অ্যাট্রিবিউটটি জানায় যে, Course
টেবিলের মধ্যে student
হল Foreign Key।@ManyToOne
: এটি Many-to-One সম্পর্ক নির্দেশ করে, এবং @JoinColumn
Foreign Key কলামকে চিহ্নিত করে।একটি Many-to-Many সম্পর্কের মধ্যে, একটি টেবিলের একাধিক রেকর্ড অন্য টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। @ManyToMany
এবং @JoinTable
অ্যানোটেশন ব্যবহার করা হয়।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course", // Join Table
joinColumns = @JoinColumn(name = "student_id"), // Foreign Key in Student table
inverseJoinColumns = @JoinColumn(name = "course_id") // Foreign Key in Course table
)
private Set<Course> courses;
// Getters and Setters
}
@Entity
public class Course {
@Id
private int id;
private String courseName;
@ManyToMany(mappedBy = "courses")
private Set<Student> students;
// Getters and Setters
}
@ManyToMany
: এটি Many-to-Many সম্পর্ক নির্দেশ করে।@JoinTable
: এটি দুটি টেবিলের মধ্যে সম্পর্ক তৈরি করার জন্য একটি join table নির্ধারণ করে।@JoinColumn
: এটি Foreign Key কলাম তৈরি করে।ফিচার | Primary Key Mapping | Foreign Key Mapping |
---|---|---|
এন্টারিটি সম্পর্ক | একটি টেবিলের প্রতিটি রেকর্ডকে ইউনিকভাবে চিহ্নিত করে। | একটি টেবিল অন্য টেবিলের সাথে সম্পর্কিত থাকে। |
অ্যানোটেশন ব্যবহার | @Id এবং @GeneratedValue | @OneToOne , @ManyToOne , @OneToMany , @ManyToMany |
ডেটাবেস টেবিলের মধ্যে সম্পর্ক | একটি টেবিলের মধ্যে একক বা ইউনিক কলাম। | টেবিলের মধ্যে সম্পর্ক তৈরি করার জন্য Foreign Key ব্যবহার। |
সর্বাধিক ব্যবহৃত সম্পর্ক | একে অপরের মধ্যে সম্পর্কিত রেকর্ডগুলির সুনির্দিষ্ট চিহ্নিতকরণ | একটি টেবিলের রেকর্ড অন্য টেবিলের সাথে সম্পর্কিত হয়। |
Hibernate-এ Primary Key এবং Foreign Key Mapping গুরুত্বপূর্ণ ভূমিকা পালন করে ডেটাবেস সম্পর্ক তৈরি করতে। Primary Key হল একটি টেবিলের প্রতি রেকর্ডের জন্য ইউনিক চিহ্ন, এবং Foreign Key ব্যবহার করে আপনি একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করতে পারেন। Hibernate এ আপনি Annotations এবং XML কনফিগারেশন ব্যবহারের মাধ্যমে সহজেই এই সম্পর্কগুলো ম্যানেজ করতে পারেন।
Read more